import { defineStore } from 'pinia'
import { login, getUserInfo, getUserAddress } from '@/api/user' // 导入API函数
import { ElMessage } from 'element-plus';

export const useUserStore = defineStore('user', {
  // 1. 【修改】state 初始化时，优先从 sessionStorage 读取，实现刷新恢复
  state: () => ({
    userInfo: JSON.parse(sessionStorage.getItem('userInfo')) || {
      userId: '',
      username: '',
      email: '',
      phone: '',
      gender: '',
      avatar: '',
      role: '',
      createTime: '',
      status: ''
    },
    userAddress: [],
    token: sessionStorage.getItem('token') || '',
    isLoading: false
  }),

  getters: {
    // 获取用户角色为 '2' 就是管理员，逻辑简化
    isAdmin: (state) => state.userInfo.role === '2' || state.userInfo.role === '3',

    // 是否已登录双感叹号（!!）：这是 JavaScript 中将值转为布尔值的常用技巧
    isLoggedIn: (state) => !!state.token
  },

  actions: {
    // 2. 【新增/修改】统一的设置用户信息方法，内部自动同步到 sessionStorage
    setUserInfo(userData) {
      this.userInfo = {
        userId: userData.userId || '',
        username: userData.username || '',
        email: userData.email || '',
        phone: userData.phone || '',
        gender: userData.gender || '',
        avatar: userData.avatar || '',
        role: userData.role?.toString() || '', // 可选链+toString 更安全
        createTime: userData.createTime || '',
        status: userData.status || ''
      };
      // 同步到 sessionStorage
      sessionStorage.setItem('userInfo', JSON.stringify(this.userInfo));
    },

    // 3. 【新增/修改】统一的设置 token 方法，内部自动同步到 sessionStorage
    setToken(token) {
      this.token = token;
      sessionStorage.setItem('token', token);
    },

    // 4. 清除用户状态
    clearUserState() {
      this.userInfo = {
        userId: '',
        username: '',
        email: '',
        phone: '',
        gender: '',
        avatar: '',
        role: '',
        createTime: '',
        status: ''
      };
      this.token = '';
      sessionStorage.removeItem('userInfo');
      sessionStorage.removeItem('token');
    },

    // 5. 登录
    async login(loginData) {
      this.isLoading = true;

      try {
        const response = await login(loginData);
        console.log("登录结果", response);

        if (response.data.code === 0) {
          // 存储 token
          this.setToken(response.data.data);
          // 获取用户信息
          const result = await this.fetchUserInfo();
          return true;
        } else {
          ElMessage({
            type: 'error',
            message: response.data.message,
            plain: true
          });
          return false;
        }
      } catch (error) {
        console.error('登录过程中发生错误:', error);
        return false;
      } finally {
        this.isLoading = false;
      }
    },

    //6.  获取用户信息
    async fetchUserInfo() {
      this.isLoading = true;

      try {
        const response = await getUserInfo();
        console.log("登录后获取用户信息", response.data.data);

        if (response.data.code === 0) {
          // 设置用户信息（会自动同步到 sessionStorage）
          this.setUserInfo(response.data.data);
          return true;
        } else {
          return false;
        }
      } catch (error) {
        console.error('获取用户信息过程中发生错误:', error);
        // 如果是 token 无效，清除用户状态
        if (error.response && error.response.status === 401) {
          this.clearUserState();
        }
        return false;
      } finally {
        this.isLoading = false;
      }
    },

    // 7.登出

    // 优化登出方法
    async logout() {
      try {
        // 调用后端登出API（如果有）
        // await logoutAPI()

        // 清除用户状态
        this.clearUserState()

        // 跳转到登录页
        const router = useRouter()
        router.push('/login')

        return true
      } catch (error) {
        console.error('登出过程中发生错误:', error)
        return false
      }
    },

    // 8. 【优化】初始化用户状态方法，现在可直接依赖 state 初始化逻辑，也可保留用于主动触发
    initUserState() {
      const userInfo = sessionStorage.getItem('userInfo');
      if (userInfo) {
        this.setUserInfo(JSON.parse(userInfo));
      }

      const token = sessionStorage.getItem('token');
      if (token) {
        this.setToken(token);
      }
    },


    //9.获取用户地址
    async fetchUserAddress() {


      try {
        const response = await getUserAddress();
        // console.log("获取用户地址:", response.data.data);

        if (response.data.code === 0) {
          // 设置用户地址
          this.userAddress = response.data.data;
          console.log("获取用户地址成功", this.userAddress);

          return true;
        } else {
          return false;
        }
      } catch (error) {
        console.error('获取用户地址过程中发生错误:', error);
        return false;
      } finally {
        this.isLoading = false;
      }
    }







  }
});